#include "mprpcconfig.h"
#include <fstream>  // 包含C++文件流头文件
#include <iostream>

// 负责解析加载配置文件
void MprpcConfig::LoadConfigFile(const std::string config_file) {
    std::ifstream infile(config_file);
    if (!infile.is_open()) {  // 检查文件是否成功打开
        std::cerr << config_file << " is not exists!" << std::endl;  // 用cerr输出错误信息
        exit(EXIT_FAILURE);
    }

    std::string src_buf;  // 存储读取的一行内容（无需固定缓冲区大小，更灵活）
    // 循环读取文件的每一行（用getline替代fgets，自动处理换行符）
    while (std::getline(infile, src_buf)) {
        // 1. 2. 去掉前后空格
        Trim(src_buf);

        // 3. 跳过空行或注释行（#开头）
        if (src_buf.empty() || src_buf[0] == '#') {
            continue;
        }

        // 4. 解析key=value格式（核心逻辑）
        int idx = src_buf.find('=');
        if (idx == std::string::npos) {  // 没有找到=，配置项不合法
            continue;
        }

        std::string key = src_buf.substr(0, idx);  // 截取=左侧作为key
        Trim(key);
        std::string value = src_buf.substr(idx + 1);  // 截取=右侧作为value（简化写法，自动取到结尾）
        Trim(value);
        // 存储到配置map中
        m_configMap[key] = value;
    }
}

// 查询配置项信息
std::string MprpcConfig::Load(const std::string& key) {
    auto it = m_configMap.find(key);
    if(it == m_configMap.end()) {
        return "";
    }
    return it->second;
}

void MprpcConfig::Trim(std::string& src_buf) {
    // 1. 去除行首多余的空格
    size_t idx = src_buf.find_first_not_of(' ');  // 用size_t（无符号）更规范，避免-1判断问题
    if (idx != std::string::npos) {  // 用string::npos替代-1（C++标准写法）
        src_buf = src_buf.substr(idx);  // 截取从第一个非空格开始的子串
    } 
    else {
        // 整行都是空格，视为空行
        src_buf.clear();
    }

    // 2. 去除行尾多余的空格
    idx = src_buf.find_last_not_of(' ');
    if (idx != std::string::npos) {
        src_buf = src_buf.substr(0, idx + 1);  // 截取到最后一个非空格（包含该字符）
    } 
    else {
        src_buf.clear();
    }
}